/*
 * Copyright:  2018 smarabbit studio.
 *
 *  Licensed under the Confluent Community License; you may not use this file
 *  except in compliance with the License.  You may obtain a copy of the License at
 *
 *  http://www.confluent.io/confluent-community-license
 *
 *  Unless required by applicable law or agreed to in writing, software
 *  distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
 *  WARRANTIES OF ANY KIND, either express or implied.  See the License for the
 *  specific language governing permissions and limitations under the License.
 *
 *  @作   者： 黄开晖 (117227773@qq.com)
 *  @日   期:  2021年12月2日
 */
package com.massyframework.beanskin.graphql;

import static graphql.schema.GraphQLArgument.newArgument;
import static graphql.schema.GraphQLFieldDefinition.newFieldDefinition;

import graphql.schema.GraphQLFieldDefinition;
import graphql.schema.GraphQLList;
import graphql.schema.GraphQLNonNull;
import graphql.schema.GraphQLTypeReference;
import graphql.schema.GraphQLUnionType;

import java.util.Objects;
import java.util.Set;

/**
 * 隐藏的实体
 * @author huangkh
 *
 */
public final class _Entity {
	public static final String argumentName = "representations";
	static final String typeName = "_Entity";
	static final String fieldName = "_entities";

	private _Entity() {
	}
	
	//graphql-java 将就地改变 GraphQLTypeReference，
	//所以每次都需要创建一个新实例。 
	static GraphQLFieldDefinition field(Set<String> typeNames) {
		Objects.requireNonNull(typeNames, "\"typeNames\" cannot be null.");
		return newFieldDefinition().name(fieldName)
				.argument(newArgument().name(argumentName)
						.type(new GraphQLNonNull(
								new GraphQLList(new GraphQLNonNull(new GraphQLTypeReference(_Any.typeName)))))
						.build())
				.type(new GraphQLNonNull(new GraphQLList(GraphQLUnionType.newUnionType().name(typeName)
						.possibleTypes(
								typeNames.stream().map(GraphQLTypeReference::new).toArray(GraphQLTypeReference[]::new))
						.build())))
				.build();
	}
}